package br.com.futebol.util;

import java.io.Closeable;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.log4j.Logger;

/**
 * Classe utilitaria para fechar tipos de conexoes e tipos de streams.
 * 
 * @author Thyago Schleuss - tschleuss@gmail.com
 */
public final class CloseUtils {

    private static final Logger LOG = Logger.getLogger(CloseUtils.class);

    /**
     * Construtor padrao
     */
    private CloseUtils() {
        throw new UnsupportedOperationException();
    }

    /**
     * Metodo para fechar objetos que implementem {@link Closeable}
     * 
     * @param obj
     */
    public static void close(final Closeable obj) {
        if (obj != null) {
            try {
                obj.close();
            } catch (IOException e) {
                LOG.error("Erro ao fechar.", e);
            }
        }
    }

    /**
     * Metodo para fechar as conexoes usadas para consulta com o banco de dados.
     * 
     * @param co
     * @param ps
     * @param rs
     */
    public static void close(final Connection co, final PreparedStatement ps, final ResultSet rs) {
        CloseUtils.close(rs);
        CloseUtils.close(ps);
        CloseUtils.close(co);
    }

    /**
     * Metodo para fechar as conexoes usadas para consulta com o banco de dados.
     * 
     * @param ps
     * @param rs
     */
    public static void close(final PreparedStatement ps, final ResultSet rs) {
        CloseUtils.close(rs);
        CloseUtils.close(ps);
    }

    /**
     * Metodo para fechar as conexoes usadas para consulta com o banco de dados.
     * 
     * @param co
     * @param ps
     */
    public static void close(final Connection co, final PreparedStatement ps) {
        CloseUtils.close(ps);
        CloseUtils.close(co);
    }

    /**
     * Metodo para fechar um Connection
     * 
     * @param co
     */
    public static void close(final Connection co) {
        if (co != null) {
            try {
                co.close();
            } catch (SQLException e) {
                LOG.error("Erro ao fechar o Connection.", e);
            }
        }
    }

    /**
     * Metodo para fechar um Statement
     * 
     * @param ps
     */
    public static void close(final Statement ps) {
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                LOG.error("Erro ao fechar o Statement.", e);
            }
        }
    }

    /**
     * Metodo para fechar um ResultSet
     * 
     * @param rs
     */
    public static void close(final ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                LOG.error("Erro ao fechar o ResultSet.", e);
            }
        }
    }
}
